#ifndef COLORMAKER_H
#define COLORMAKER_H

#include <QObject>
#include <QColor>
#include <QTimerEvent>

//实现可以导出的C++类
class ColorMaker : public QObject
{
    Q_OBJECT
    //导出的类定义了想在QML文件中使用的枚举类型，使用Q_ENUMS宏将该枚举类型注册到元对象系统中
    Q_ENUMS(GenerateAlgorithm)
    //Q_PROPERTY宏用来定义可通过元对象系统访问的属性，通过它定义的属性，可以在QML文件中访问、修改，也可以在属性变化时发射特定的信号
    //注意：使用Q_PROPERTY宏，该类必须是QObject的后裔，必须先在类首使用Q_OBJECT宏
    //Q_PROPERTY(type name READ name WRITE setName NOTIFY nameChanged)
    /*
    READ--声明一个读取属性的函数，该函数一般没有参数，返回定义的属性
    WRITE---可选配置。声明一个设定属性的函数，它指定的函数没有返回值，只能有一个与属性类型匹配的参数。
    NOTICE---可选配置。给属性关联一个信号（该信号必须是已经在类中声明过的），当属性的值发生变化时就会触发该信号。信号的参数一般就是你定义的属性。
    */
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
    Q_PROPERTY(QColor timeColor READ timeColor)

public:
    explicit ColorMaker(QObject *parent = nullptr);
    ~ColorMaker();
    //枚举变量--5种颜色算法
    enum GenerateAlgorithm{
        RandomRGB,
        RandomRed,
        RandomGreen,
        RandomBlue,
        LinearIncrease //线性渐变
    };
    /*
    通过把类成员函数声明为const 以表明它们不修改类对象。 任何不会修改数据成员的函数都应该声明为const类型。
    如果在编写const成员函数时，不慎修改了数据成员，或者调用了其它非const成员函数，
    编译器将指出错误，这样做的好处是提高程序了的健壮性。
    */
    QColor color() const;//常量成员函数---指明不可修改成员变量的值
    void setColor(const QColor & color);
    QColor timeColor() const;
    //在定义一个类的成员函数时， 使用Q_INVOKABLE宏来修饰，就可以让该方法被元对象系统调用。这个宏必须放在返回类型前面
    Q_INVOKABLE GenerateAlgorithm getAlgorithm() const; //返回类型为GenerateAlgorithm，这是一个算法函数
    Q_INVOKABLE void setAlgorithm(GenerateAlgorithm algorithm);//设置使用那种颜色计算方法
signals:
    void colorChanged(const QColor & color);//改变颜色的信号
    void currentTimer(const QString &strTime);//当前时间的信号
public slots:
    void start();
    void stop();

protected:
    void timerEvent(QTimerEvent *event);//时间事件
private:
    GenerateAlgorithm m_algorithm;
    QColor myColor;//现在的颜色
    int m_nColorTimer;//定时器的ID
};
#endif // COLORMAKER_H
